package com.bd.module.salegood.ui;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

import com.bd.module.BaseFrame;
import com.bd.module.salegood.pojo.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;

/**
 * 这个类是当前挂起商品信息处理对话框的主界面类
 *
 */
public class ExchangeInfoDialog extends JDialog implements ListSelectionListener,KeyListener{
	private EDialogExpPanel exPanel;								//对话框说明面板
	private EDialogLabelPanel labelPanel;							//对话框标题面板
	private EDialogListPanel listPanel;							//对话框列表组件面板
	private EDialogTablePanel tablePanel;							//对话框表单组件面板
	private EDialogTableModel dataModel = new EDialogTableModel(); //对话框数据接口
	private String fileName;										//当前要存储的文件名
	public boolean isOK = false;									//对话框当前状态
	private int listOrderNumber;									//列表序号
	
	public ExchangeInfoDialog(){
		this(null);
	}
	
	/**
	 * 构造方法
	 * @param frame
	 */
	public ExchangeInfoDialog(JFrame frame){
		super(frame,"交易信息",true);
		try{
			jbInit();
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
	}
	
	/*
	 * 窗口初始化
	 */
	public void jbInit(){
		exPanel = new EDialogExpPanel();
		labelPanel = new EDialogLabelPanel();
		listPanel = new EDialogListPanel(this);
		tablePanel = new EDialogTablePanel(dataModel);

		Container con= getContentPane();
		con.setLayout(new BorderLayout());							//对话框说明面板设置
		exPanel.setMaximumSize(new Dimension(500,30));
		exPanel.setPreferredSize(new Dimension(500,30));
		con.add(exPanel,BorderLayout.SOUTH);
		
		labelPanel.setMaximumSize(new Dimension(500,50));			//对话框标题面板设置
		labelPanel.setPreferredSize(new Dimension(500,50));
		con.add(labelPanel,BorderLayout.NORTH);
		
		listPanel.setMaximumSize(new Dimension(100,290));			//对话框列表组件面板设置
		listPanel.setPreferredSize(new Dimension(100,290));
		con.add(listPanel,BorderLayout.WEST);
		
		tablePanel.setMaximumSize(new Dimension(400,290));			//对话框table组件面板设置
		tablePanel.setPreferredSize(new Dimension(400,290));
		con.add(tablePanel,BorderLayout.CENTER);
		
		this.setTitle("交易信息");
		pack();
		setResizable(false);										//设置对话框不可调整
		
		this.addWindowListener(new WindowAdapter()					//对话框现化后设置JList组件作为焦点
		{
			public void windowOpened(WindowEvent e){
				listPanel.jList.grabFocus();
			}
		});
	}
	
	/*
	 *  这是一个列表项监听方法。当列表中选择的项目改变后，把对应的信息在table中进行显示
	 * 	注意：我之所以把方法放在主界面类中的原因，是由于此类属于上层类存有多个对象，当其他
	 *  	 对象也需要JList进行激发的时候，我们可以很方便在这里进行扩展，而不需要进行多个类
	 *  	 中对象的传递；如有问题请参照对象交互树图原则，或联系我：小君之友 QQ 373426487
	 */
	public void valueChanged(ListSelectionEvent e) {				
		JList list = (JList)e.getSource();
		ListSelectionModel lsm = list.getSelectionModel();                          //获取列表选择模式
		int minIndex = lsm.getMinSelectionIndex();
		int maxIndex = lsm.getMaxSelectionIndex();
		for(int selectIndex = minIndex;selectIndex <= maxIndex;selectIndex++){
			if(lsm.isSelectedIndex(selectIndex)){
				listOrderNumber = MyListDataModel.getVectorValue(selectIndex);      //获取当前选定列表的值
				/*
				 * 以下代码将把要挂起的交易从文件中读取出来
				 * 注意：这个方法是不合理的。最好使用Map类进行哈西存储，之所以这样是由于前面我已经使用了哈西方法；
				 * 		是不是还有更好的方法，如果有请告诉我
				 */
				try{
					fileName = String.valueOf(listOrderNumber);						
					FileInputStream inStream = new FileInputStream(fileName);
					ObjectInputStream oiStream = new ObjectInputStream(inStream);
					Vector v = (Vector)oiStream .readObject();
					dataModel.setVector(v);
					tablePanel.table.revalidate();
					tablePanel.table.repaint();
					oiStream.close();
				}
				catch(IOException io){
					System.out.println(io.getMessage());
				}
				catch(ClassNotFoundException ex){
					System.out.println(ex.getMessage());
				}
			}
		}
	}
	

	public void keyTyped(KeyEvent e) {}
	
	/*
	 *  以下为键盘监听类，主要进行窗口关闭前的一些处理工作
	 */
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode() == KeyEvent.VK_ENTER){
			File file = new File(fileName);
			file.delete();
			SalseGoodPanel.getSgp().isAddOrderNumber = false;
			GoodsDataModel.setNowVector(dataModel.getVector());
			MyListDataModel.delVectorValue(listOrderNumber);
			isOK = true;
			setVisible(false);
		}
		else if(e.getKeyCode() == KeyEvent.VK_ESCAPE){
			setVisible(false);
		}
	}

	public void keyReleased(KeyEvent e) {}
}